package cn.qvtu.game.frame;

import cn.qvtu.game.model.BackGround;
import cn.qvtu.game.model.Enemy;
import cn.qvtu.game.model.Person;
import cn.qvtu.game.util.StaticValue;

import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Date;

public class MyFrame extends JFrame implements Runnable, KeyListener {
    // 记录程序启动时间
    private Date startTime = new Date();
    // 添加人物
    private Person person;
    // 当前的场景
    private BackGround NowBackGround;
    public MyFrame() {
        // 设置窗口标题
        setTitle("Mygame");
        // 设置窗口大小
        setSize(900, 600);
        // 设置窗口居中显示
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        this.setLocation((width - 900) / 2, (height - 600)/ 2);
        // 初始化场景
        NowBackGround = new BackGround(1);
        // 设置窗口关闭时退出程序
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        // 添加键盘监听器
        this.addKeyListener(this);

        // 创建人物对象
        person = new Person(0,305,NowBackGround);

        // 创建线程任务 传入对象为Runnable接口的实现类
        Thread thread = new Thread(this);
        thread.start();
    }

    /**
     * 重写画笔方法，绘制窗口背景
     * @param g the specified Graphics window
     */
    @Override
    public void paint(Graphics g) {
        // 绘制背景
        BufferedImage image = new BufferedImage(900, 600, BufferedImage.TYPE_INT_RGB);
        // 获取画笔
        Graphics graphics = image.getGraphics();

        Font font = new Font("微软雅黑", Font.BOLD, 24); // 设置字体为 Arial，粗体，大小为 24
        graphics.setFont(font); // 应用字体
        // 绘制背景图片
        graphics.drawImage(NowBackGround.getShowImage(), 0, 0, this);

        // 添加时间显示组件(第一个参数为时间字符串，第二个参数为坐标)
        long dif = new Date().getTime() - startTime.getTime();
        graphics.drawString("时间 "+(dif/1000/60)+":"+(dif/1000%60), 750, 60);

        // 绘制敌人
        ArrayList<Enemy> enemyList = (ArrayList<Enemy>) NowBackGround.getEnemyList(); // 获取敌人列表
        for (Enemy enemy : enemyList) {
            graphics.drawImage(enemy.GetShowImage(), enemy.getX(), enemy.getY(), this);
        }
        // 绘制人物
        graphics.drawImage(person.GetShowImage(), person.getX(), person.getY(), this);
        // 绘制得分
        graphics.drawString("得分 " + person.getScore(), 400, 60);


        // 以image作为图形源绘制窗口
        g.drawImage(image, 0, 0, this);

        // 是否进入下一场景
        if (NowBackGround.hasNext() && NowBackGround.isPass(person)){
            NowBackGround = NowBackGround.next();
            person.setX(0);
            person.setBackground(NowBackGround);
        }
    }
    @Override
    public void run() {
        while (true) {
            // 刷新窗口
            repaint();
            // 延迟50毫秒
            try {
                Thread.sleep(50);
            }
            catch (InterruptedException e) {
                    e.printStackTrace();
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    // 键盘按下事件
    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        // 按下D键 向右移动
        if (keyCode == KeyEvent.VK_D) {
            this.person.RunRight();
        }
        // 按下A键 向左移动
        if (keyCode == KeyEvent.VK_A) {
            this.person.RunLeft();
        }
        // 按下空格键 跳跃
        if (keyCode == KeyEvent.VK_SPACE) {
            this.person.Jump();
        }
        // 按下F键 攻击
        if (keyCode == KeyEvent.VK_F) {
            this.person.Attack();
        }
    }

    // 键盘释放事件
    @Override
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        // 释放D键 停止向右移动
        if (keyCode == KeyEvent.VK_D) {
            this.person.StopRunRight();
        }
        // 释放A键 停止向左移动
        if (keyCode == KeyEvent.VK_A) {
            this.person.StopRunLeft();
        }
    }
}
